home *** CD-ROM | disk | FTP | other *** search
/ Delphi 2 - Developers' Solutions / Delphi 2 Developers' Solutions.iso / dds / chap08 / howto06 / delphi10 / mtrans / mtform.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1996-02-10  |  4.6 KB  |  191 lines

  1. unit Mtform;
  2.  
  3. { Assuming the following tables exists on CSHOWTO alias:
  4.  
  5.     CREATE TABLE PROGRAM (
  6.       PROGRAM_ID INTEGER NOT NULL,
  7.       NAME VARCHAR(30),
  8.       VERSION VARCHAR(10),
  9.       PRIMARY KEY (PROGRAM_ID)
  10.     );
  11.  
  12.     CREATE TABLE KEYTABLE (
  13.       TABLENAME CHAR(31) NOT NULL,
  14.       NEXTKEY DOUBLE PRECISION,
  15.       PRIMARY KEY (TABLENAME)
  16.     );
  17.  
  18. }
  19.  
  20. interface
  21.  
  22. uses
  23.   SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  24.   Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, DB, DBTables;
  25.  
  26. type
  27.   TMultiTransactionForm = class(TForm)
  28.     MainDatabase: TDatabase;
  29.     ProgramDataSource: TDataSource;
  30.     ProgramTable: TTable;
  31.     ProgramDBGrid: TDBGrid;
  32.     ProgramDBNavigator: TDBNavigator;
  33.     procedure FormCreate(Sender: TObject);
  34.     procedure ProgramTableAfterPost(DataSet: TDataset);
  35.     procedure ProgramTableAfterDelete(DataSet: TDataset);
  36.     procedure ProgramTableAfterCancel(DataSet: TDataset);
  37.     procedure ProgramTableBeforeInsert(DataSet: TDataset);
  38.     procedure ProgramTableAfterInsert(DataSet: TDataset);
  39.     procedure FormDestroy(Sender: TObject);
  40.   private
  41.     { Private declarations }
  42.     KeyDatabase: TDatabase;
  43.     NextProgramId: LongInt;
  44.   public
  45.     { Public declarations }
  46.   end;
  47.  
  48. var
  49.   MultiTransactionForm: TMultiTransactionForm;
  50.  
  51. implementation
  52.  
  53. {$R *.DFM}
  54.  
  55. procedure TMultiTransactionForm.FormCreate(Sender: TObject);
  56. begin
  57.   try
  58.     KeyDatabase := TDatabase.Create( Self );
  59.     With KeyDatabase do
  60.     begin
  61.       AliasName := MainDatabase.AliasName;
  62.       DatabaseName := 'TheKeyDatabase';
  63.       KeepConnection := True;
  64.       With Params do
  65.       begin
  66.         Clear;
  67.         Add( 'USER NAME=sysdba' );
  68.         Add( 'PASSWORD=masterkey' );
  69.       end;
  70.       LoginPrompt := False;
  71.       Open;
  72.     end;
  73.     MainDatabase.StartTransaction;
  74.     ProgramTable.Open;
  75.   except
  76.     on E: EDatabaseError do
  77.     begin
  78.       MessageBeep( $FFFF );
  79.       Application.ShowException( E );
  80.       Application.Terminate;
  81.     end;
  82.   end;
  83. end;
  84.  
  85. procedure TMultiTransactionForm.ProgramTableAfterPost(DataSet: TDataset);
  86. begin
  87.   MainDatabase.Commit;
  88.   Refresh;
  89.   MainDatabase.StartTransaction;
  90. end;
  91.  
  92. procedure TMultiTransactionForm.ProgramTableAfterDelete(DataSet: TDataset);
  93. begin
  94.   MainDatabase.Commit;
  95.   MainDatabase.StartTransaction;
  96. end;
  97.  
  98. procedure TMultiTransactionForm.ProgramTableAfterCancel(DataSet: TDataset);
  99. begin
  100.   MainDatabase.Rollback;
  101.   Refresh;
  102.   MainDatabase.StartTransaction;
  103. end;
  104.  
  105. procedure TMultiTransactionForm.ProgramTableBeforeInsert(
  106.   DataSet: TDataset);
  107. var
  108.   KeyQuery: TQuery;
  109. begin
  110.   try
  111.     KeyDatabase.StartTransaction;
  112.     KeyQuery := TQuery.Create( Self );
  113.     try
  114.       with KeyQuery do
  115.       begin
  116.         DatabaseName := KeyDatabase.DatabaseName;
  117.         UniDirectional := True;
  118.         Close;
  119.         with Sql do
  120.         begin
  121.           Clear;
  122.           Add( 'SELECT NEXTKEY' );
  123.           Add( 'FROM KEYTABLE' );
  124.           Add( 'WHERE TABLENAME = ''' +
  125.                ProgramTable.TableName +
  126.                ''''
  127.           );
  128.         end;
  129.         Open;
  130.         if RecordCount <> 0 then
  131.         begin
  132.           NextProgramId := FieldByName( 'NEXTKEY' ).AsInteger;
  133.           Close;
  134.           with Sql do
  135.           begin
  136.             clear;
  137.             Add( 'UPDATE KEYTABLE' );
  138.             Add( 'SET NEXTKEY = NEXTKEY + 1' );
  139.             Add( 'WHERE TABLENAME = ''' +
  140.                  ProgramTable.TableName +
  141.                  ''''
  142.             );
  143.           end;
  144.           ExecSql;
  145.         end
  146.         else { RecordCount = 0 }
  147.         begin
  148.           { This is the very first time a record is inserted. }
  149.           NextProgramId := 1;
  150.           Close;
  151.           with Sql do
  152.           begin
  153.             Clear;
  154.             Add( 'INSERT INTO KEYTABLE ( TABLENAME, NEXTKEY )' );
  155.             Add( 'VALUES ( ''' +
  156.                  ProgramTable.TableName +
  157.                  ''', 2 )'
  158.             );
  159.           end;
  160.           ExecSql;
  161.         end;
  162.       end;
  163.     finally
  164.       KeyQuery.Free;
  165.     end;
  166.     KeyDatabase.Commit;
  167.   except
  168.     On E: EDatabaseError do
  169.     begin
  170.       KeyDatabase.Rollback;
  171.       MessageBeep( $FFFF );
  172.       E.Message := E.Message + '.' + chr(10) + chr(13) +
  173.                    'Unable to generate new key';
  174.       raise;
  175.     end;
  176.   end;
  177. end;
  178.  
  179. procedure TMultiTransactionForm.ProgramTableAfterInsert(DataSet: TDataset);
  180. begin
  181.   ProgramTable.FieldByName( 'PROGRAM_ID' ).AsInteger := NextProgramId;
  182. end;
  183.  
  184. procedure TMultiTransactionForm.FormDestroy(Sender: TObject);
  185. begin
  186.   ProgramTable.Close;
  187.   MainDatabase.Commit;
  188. end;
  189.  
  190. end.
  191.